﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using Librerias;

namespace eCampus
{
    public partial class FormBuscaAvanzada : Form
    {
        #region Datos
        int tipoUsuario = 0;
        int elPadre;
        int numsBasicos = 0;
        Size botonStandar;
        GroupBox[] groupBoxSelectUsu = new GroupBox[2];
        Point LocationBtQuitar = new Point();
        FormResultadoBuscaAvanzada fResultados;
        DataTable dtUsuarios, dtUsuariosConAsigs, dtUsuConDepto, dtUsuPorDepto, dtUsuPorAsigs;
        Boolean usuariosVacios=true,busquedaUsuariosVacia=true,sinResultados = true ;
        //busquedaAsigSoloVacio=true,busquedaDeptSoloVacio=true,
        String sinResultadosString = "Su búsqueda no ha producido ningún resultado, inténtelo de nuevo.",
            faltaSeleccion="Debe introducir algún criterio de búsqueda.";


        #endregion

        #region Constructores
        // Si lo llama administrador, a=1. Profesor a=2
        public FormBuscaAvanzada(int a)
        {
            InitializeComponent();
            elPadre = a; 

            LocationBtQuitar = btEliminaCriterio.Location;
            botonStandar = btEliminaCriterio.Size;
           
            if (elPadre == 1) // el padre es admin
            {
                gbTipoUsuarios.Visible = true;
                gbParaProfesor.Visible = false;
                rbProfesorAdm.Checked = true;
            }
            else
            {
                gbParaProfesor.Top = gbTipoUsuarios.Top;
                gbTipoUsuarios.Visible = false;
                gbParaProfesor.Visible = true;
                rbProfesorProf.Checked = true;
            }
            selectorAsignatura.cargaListBox(0);
            selectorDepartamento.cargaListBox(1);           

         }

        public void setFResultados ( FormResultadoBuscaAvanzada f){
            fResultados = f;
        }
        #endregion

        #region Comportamiento
        /// <summary>
        /// Colorear paneles de flCriteriosUsu
        /// </summary>
        private void AjustarColor()
        {
            int cont = 0;
            foreach (Control c in fLCriteriosUsu.Controls)
            {
                if (c is Panel)
                {
                    if (cont % 2 == 0)
                    {
                        c.BackColor = SystemColors.Control;
                    }
                    else
                    {
                        c.BackColor = Color.Beige;
                    }
                    cont++;
                }
            }
        }
        /// <summary>
        /// Gestión de los controles de usuario selectores de asignatura y departamento
        /// </summary>
        private void controlCajas()
        {
            switch (tipoUsuario)
            {
                case 1:
                    reiniciarflCriterios();
                    selectorAsignatura.setNombre("Imparte asignatura/s:");
                    selectorDepartamento.setNombre("Pertenece al departamento:");
                    selectorAsignatura.Visible = true;
                    selectorDepartamento.Visible = true;
                    selectorAsignatura.Reinicia();
                    selectorDepartamento.Reinicia();
                    break;
                case 2:
                    reiniciarflCriterios();
                    selectorAsignatura.setNombre("Cursa asignatura/s:");
                    selectorDepartamento.setNombre("");
                    selectorAsignatura.Visible = true;
                    selectorDepartamento.Visible = false;
                    selectorAsignatura.Reinicia();
                    break;
                case 0:                    
                    reiniciarflCriterios();
                    selectorAsignatura.setNombre("");
                    selectorDepartamento.setNombre("");
                    selectorAsignatura.Visible = false;
                    selectorDepartamento.Visible = false;
                    break;
            }
        }

        /// <summary>
        /// Reiniciar formularios criterios de usuario
        /// </summary>
        public void reiniciarflCriterios()
        {
            while (fLCriteriosUsu.Controls.Count > 1)
            {
                fLCriteriosUsu.Controls.RemoveAt(0);
            }
            foreach (Control c in fLCriteriosUsu.Controls[0].Controls)
            {
                if (c is Librerias.Controles.CTRLbuscaBasicaUsuario)
                {
                    ((Librerias.Controles.CTRLbuscaBasicaUsuario)c).limpiaControl();
                    break;
                }
            }
            
        }
        /// <summary>
        /// Eliminar un panel de flCriteriosUsu
        /// </summary>
        /// <param name="tipo">Tipo de usuario</param>
        /// <returns>DataTable de usuarios</returns>
        public void eliminacion(object sender, EventArgs e)
        {
            Object o;
            if (fLCriteriosUsu.Controls.Count == 1)
            {
                o = ((Panel)((Button)sender).Parent).Controls[0];
                if (o is Button)
                {
                    o = ((Panel)((Button)sender).Parent).Controls[1];
                }
                ((Librerias.Controles.CTRLbuscaBasicaUsuario)o).limpiaControl();
            }
            else
            {
                fLCriteriosUsu.Controls.Remove(((Button)sender).Parent);
            }
            AjustarColor();
        }
        /// <summary>
        /// Estado de los paneles de flCriterioUsu
        /// </summary>
        /// <returns>Estado vacío true/false</returns>
        public Boolean flCriteriosEstaVacio()
        {
            Librerias.Controles.CTRLbuscaBasicaUsuario m;
            Boolean vacio = true;

            foreach (Control c in fLCriteriosUsu.Controls)
            {
                if (c is Panel)
                {
                    foreach (Control cc in c.Controls)
                    {

                        if (cc is Librerias.Controles.CTRLbuscaBasicaUsuario)
                        {
                            m = (Librerias.Controles.CTRLbuscaBasicaUsuario)cc;
                            if (!m.estaVacio()) { vacio = false; break; }
                        }
                    }
                }
            }
            return vacio;
        }

        /// <summary>
        /// Añadir un nuevo formulario de usuario individual a flCriterioUsu
        /// </summary>
        private void btNuevoCriterio_Click_1(object sender, EventArgs e)
        {
            // crear panel
            Panel pnNew = new Panel();
            pnNew.Size = pnBaseUsu.Size;
            pnNew.Margin = pnBaseUsu.Margin;
            int id = numsBasicos++;

            // crear boton elimina
            Button btElimina = new Button(); // botón nuevo criterio
            btElimina.Name = id.ToString();
            btElimina.Image = Properties.Resources.btMenos;
            btElimina.FlatStyle = FlatStyle.Flat;
            btElimina.Size = botonStandar;
            btElimina.ForeColor = Color.Transparent;
            btElimina.Location = LocationBtQuitar;
            btElimina.Click += new EventHandler(eliminacion);
            //btElimina.
            toolTip1.SetToolTip(btElimina, "Eliminar criterio");
                        
            // crear criterio búsqueda básico
            Librerias.Controles.CTRLbuscaBasicaUsuario b = new Librerias.Controles.CTRLbuscaBasicaUsuario(id);
            b.Location = basico1.Location;
            b.Name = "controlPropio";
            
            // añadir al panel los elementos      
            pnNew.Controls.Add(b);
            pnNew.Controls.Add(btElimina);
            
            fLCriteriosUsu.Controls.Add(pnNew);
            AjustarColor();    
            
        }
        #endregion

        #region RadioButtons eventos
      
        private void rbProfesorAdm_CheckedChanged(object sender, EventArgs e)
        {
            tipoUsuario = 1;
            controlCajas();
        }

        private void rbEstudianteAdm_CheckedChanged(object sender, EventArgs e)
        {
            tipoUsuario = 2;
            controlCajas();
        }

        private void rbAdministrador_CheckedChanged_1(object sender, EventArgs e)
        {
            tipoUsuario = 0;
            controlCajas();
        }
        private void rbProfesorProf_CheckedChanged(object sender, EventArgs e)
        {
            tipoUsuario = 1;
            controlCajas();
        }

        private void rbEstudianteProf_CheckedChanged(object sender, EventArgs e)
        {
            tipoUsuario = 2;
            controlCajas();
        } 
        #endregion

        /// <summary>
        /// Ejecución de las comprobaciones para realizar la búsqueda solicitada
        /// </summary>
        private void btBuscar_Click_1(object sender, EventArgs e)
        {
            
            DataTable datosCriterios = null;
            DataTable  InterseccionDepartamentos=null, InterseccionAsignatura = null;
            ArrayList listaCodDepartamentos = null, listaCodAsignaturas = null;
            Librerias.Controles.CTRLbuscaBasicaUsuario ctrl = null;
            usuariosVacios=true;  
            busquedaUsuariosVacia = false; 
            //busquedaAsigSoloVacio = false; busquedaDeptSoloVacio = false;
            sinResultados = true; 
            //Si está vacío, no continuamos
            if (flCriteriosEstaVacio() && selectorAsignatura.sinSeleccion() && selectorDepartamento.sinSeleccion())
            {
                MessageBox.Show(faltaSeleccion);
            }
            else
            {
            // Gestion de los controlesCriterio
            if (!flCriteriosEstaVacio())
            {
                usuariosVacios = false;
                // realizar la búsqueda con los criterios de usuario
                foreach (Panel o in fLCriteriosUsu.Controls)
                {
                    foreach (Object c in o.Controls)
                    {
                        if (c is Librerias.Controles.CTRLbuscaBasicaUsuario)
                        {
                            ctrl = (Librerias.Controles.CTRLbuscaBasicaUsuario)c;
                            break;
                        }
                    }
                    if (!ctrl.estaVacio())
                    {                   
                        if (datosCriterios == null)
                        {
                            datosCriterios = new DataTable();
                        }
                        datosCriterios.Merge(ctrl.losUsuariosCon(tipoUsuario));
                    }
                }
                dtUsuarios = datosCriterios;
                if (datosCriterios.Rows.Count > 0)
                {
                    busquedaUsuariosVacia = false;
                    sinResultados = false;
                }
                else
                {
                    busquedaUsuariosVacia = true;
                }
            }
           
            
            // Gestión de los controles Departamento y asignatura            
            if (tipoUsuario == 1)
            {
                if (!selectorDepartamento.sinSeleccion())
                {
                    if (usuariosVacios == false && busquedaUsuariosVacia)
                    {
                        sinResultados = true;
                    }else
                    if ((usuariosVacios==false && busquedaUsuariosVacia==false) || usuariosVacios)
                    {
                        listaCodDepartamentos = selectorDepartamento.dameElegidosCodigos();
                        InterseccionDepartamentos = recuperaCoincidencias(datosCriterios, listaCodDepartamentos, "usuDepto");
                    }
                    
                }
            }
            if (tipoUsuario > 0)
            {
                if (!selectorAsignatura.sinSeleccion())
                {
                    if (usuariosVacios == false && busquedaUsuariosVacia)
                    {
                        sinResultados = true;
                    }else if ((usuariosVacios==false && busquedaUsuariosVacia==false) || usuariosVacios)
                    {
                        listaCodAsignaturas = selectorAsignatura.dameElegidosCodigos();
                        InterseccionAsignatura = recuperaCoincidencias(datosCriterios, listaCodAsignaturas, "");
                    }
                }
            }       
            
            if (sinResultados)
            {
                MessageBox.Show(sinResultadosString);
            }
            else
            {
                evaluaEstado();
                fResultados.Focus();
            }
        }
        }

        /// <summary>
        /// Intersección de los datos de usuario y asignatura||departamento
        /// </summary>
        /// <param name="datos">DataTable con los datos de los usuarios</param>
        /// <param name="crits">ArrayList con los códigos de asignaturas||departamentos</param>
        /// <param name="column">String que determina el tipo de intersección</param>
        /// <returns>DataTable de usuarios coincidentes</returns>      
        private DataTable recuperaCoincidencias ( DataTable datos, ArrayList crits, String column)
        {
            DataTable dt = new DataTable();
            ENAsignatura asig = new ENAsignatura();
            ENUsuario usu = new ENUsuario();
            Boolean usuariosVacios = false;

            if (datos == null ) usuariosVacios = true;
            
            // asignaturas
            if (!column.Equals("usuDepto"))  
            {
                // 1 tabla con todas las asignaturas de los profesores ->dt                
                if (!flCriteriosEstaVacio())                 
                {
                    if (datos.Rows.Count > 0)
                    {
                        // Tabla de las asignaturas de todos los profesores
                        foreach (DataRow r in datos.Rows)
                        {

                            dt.Merge(asig.ConsultaAsignaturasPorCorreoUsuYTipoDataTable(r.ItemArray[0].ToString(), tipoUsuario));
                        }
                        // Eliminacion de filas que no contienen asignaturas que interesan
                        DataRow rr = null;
                        int a = dt.Rows.Count - 1;
                        String asignatura = "";
                        for (int j = a; j >= 0; j--)
                        {
                            rr = dt.Rows[j];
                            asignatura = rr.ItemArray[5].ToString().Trim();
                            if (!crits.Contains(asignatura))
                            {
                                dt.Rows.Remove(rr);
                            }
                        }
                        dtUsuariosConAsigs = dt;
                        if (dt.Rows.Count > 0)
                        {                            
                            sinResultados=false;
                        }
                    }
                    else
                    {
                        usuariosVacios = true;
                    }                    
                }
                if (usuariosVacios)
                {
                    // Recuperar una tabla con los profesores de todas las asignaturas en el destino
                    foreach (String s in crits)
                    {
                        dt.Merge(usu.ConsultarUsuariosPorTipoUsuYAsignatura(s, tipoUsuario));
                    }
                    dtUsuPorAsigs = dt;
                    if (dt.Rows.Count > 0)
                    {
                        sinResultados = false;
                        //busquedaAsigSoloVacio = false;
                    }
                    else
                    {
                        //busquedaAsigSoloVacio = true;
                    }
                }
            }
            else  // departamentos
            if (crits.Count != 0)
            {
                if (!usuariosVacios)
                {
                    dt = datos;

                    DataRow rrr = null;
                    int a = dt.Rows.Count - 1;
                    for (int j = a; j >= 0; j--)
                    {
                        rrr = dt.Rows[j];
                        if (!crits.Contains(rrr.ItemArray[2].ToString().Trim()))
                        {
                            dt.Rows.Remove(rrr);
                        }
                    }
                    dtUsuConDepto = dt;
                    if (dt.Rows.Count > 0)
                    {
                        sinResultados = false;
                    }                 
                }
                else
                {
                    // tabla con los profesores de los departamentos
                    foreach (String s in crits)
                    {
                        dt.Merge(usu.ConsultarProfesoresPorDepartamento(s));
                    }
                    dtUsuPorDepto = dt;
                    if (dt.Rows.Count > 0)
                    {
                        sinResultados = false;
                        //busquedaDeptSoloVacio = false;
                    }
                    else
                    {
                        //busquedaDeptSoloVacio = true;
                    }
                }
            }
            return dt;
        }
        /// <summary>
        /// Selección de los DataTable que se mostrarán en el formulario fResultados
        /// </summary>
        private void evaluaEstado()
        {
            if (tipoUsuario == 0) // admin
            {
                // hay que crear el datagrid y mandarlo al otro formulario
                fResultados.integrarDT(dtUsuarios, 1,false,tipoUsuario);                
            }
            else if (tipoUsuario ==2)
            {
                if (usuariosVacios) 
                {
                    //enviar datagrid de los result de las asig
                    fResultados.integrarDT(dtUsuPorAsigs, 1, true, tipoUsuario);
                }
                else if (selectorAsignatura.sinSeleccion())
                {
                    // enviar dg de result de usuarios
                    fResultados.integrarDT(dtUsuarios, 1, false, tipoUsuario);
                }
                else 
                {
                    // enviar dg del cruce
                    fResultados.integrarDT(dtUsuariosConAsigs, 1, true, tipoUsuario);
                }
            }
            else if (tipoUsuario == 1)
            {
                if (usuariosVacios)
                {
                    if (selectorDepartamento.sinSeleccion())
                    {
                        // resultado para asignaturas
                        fResultados.integrarDT(dtUsuPorAsigs, 1, true, tipoUsuario);
                    }
                    else if (selectorAsignatura.sinSeleccion())
                    {
                        //resultado para departamentos
                        fResultados.integrarDT(dtUsuPorDepto, 1, false, tipoUsuario);
                    }
                    else
                    {
                        // dos tablas
                        fResultados.integrarDT(dtUsuPorAsigs, 1, true, tipoUsuario);
                        fResultados.integrarDT(dtUsuPorDepto, 2, false, tipoUsuario);
                    }
                }
                else if (selectorAsignatura.sinSeleccion())
                {
                    if (selectorDepartamento.sinSeleccion())
                    {
                        fResultados.integrarDT(dtUsuarios, 1, false, tipoUsuario);
                    }
                    else
                    // habrá resultados con departamento
                    fResultados.integrarDT(dtUsuConDepto, 1, false, tipoUsuario);
                }
                else if (selectorDepartamento.sinSeleccion())
                {
                    if (selectorAsignatura.sinSeleccion())
                    {
                        fResultados.integrarDT(dtUsuarios, 1, false, tipoUsuario);
                    }
                    else
                    // resultados con asignatura
                    fResultados.integrarDT(dtUsuariosConAsigs, 1, false, tipoUsuario);
                }
                else
                {
                    // hay dos tablas de resultados
                    fResultados.integrarDT(dtUsuariosConAsigs, 1, false, tipoUsuario);
                    //dgUsuConDepto
                    fResultados.integrarDT(dtUsuConDepto, 2, false, tipoUsuario);
                }
            }
        }

        /// <summary>
        /// Elimina criterio de la busqueda
        /// </summary>
        /// <param name="sender">btEliminaCriterio</param>
        /// <param name="e">Click_1</param>
        private void btEliminaCriterio_Click_1(object sender, EventArgs e)
        {
            eliminacion(sender, e);
        }
    }
}
